﻿/**
* 第2章 数据、变量和计算
* 2.1 C++程序结构
* --1 程序注释
* --2 #include指令——头文件
* --3 名称空间和using声明
* 2.1.1 main()函数
* 2.1.2 程序语句
* 2.3 空白
* 2.1.4 语句块
* 2.1.5 自动生成的控制台程序
* --1 预编译的头文件
* --2 main函数名
* 2.2 定义变量
* 2.2.1 命名变量
* 2.2.2 关键字
* 2.2.3 声明变量
* 2.2.4 变量的初始值
* 2.3 基本数据类型
* 2.3.1 整形变量
* 2.3.2 字符数据类型
* 2.3.3 整形修饰符
* 2.3.4 布尔类型
* 2.3.5 浮点类型
* 2.3.6 C++中的基本类型
* 2.3.7 字面值
* 2.3.8 定义类型的别名
* 2.4 基本的输入/输出操作
* 2.4.1 从键盘输入
* 2.4.2 到命令行的输出
* 2.4.3 格式化输出
* 2.4.4 转义序列
* 2.5 C++中的计算
* 2.5.1 赋值语句
* 2.5.2 算术运算
*/

#include <iostream>
#include <iomanip>

using std::cout;
using std::endl;
using std::setw;
using std::cin;

int main() {


    int apples, oranges;
    int fruit;

    apples = 5; oranges = 6;
    fruit = apples + oranges;

    cout << endl;
    cout << "Oranges are not the only fruit..." << endl
        << "- and we have " << fruit << " fruits in all.";

    // 设置初始值方式1
    {
        int value = 0;
        int count = 10;
        int number = 5;
    }

    // 设置初始值方式2
    {
        int value(0);
        int count(10);
        int number(5);
    }

    // 设置初始值方式3
    {
        int value{};
        int count{ 10 };
        int number{ 5 };
    }

    {
        // 整型，4字节
        int toeCount = 10;

        // 短整型，2字节
        short feePerPerson = 2;
        short int feePerYard = 3;

        // 长整型，Visual C++ 4字节，其他编译器8字节
        long bigNumber = 1000000L;
        long int largeValue{};

        // 长长整型，8字节
        long long huge = 100000000LL;
    }

    // 字符型，1字节
    {
        char letter = 'A';
    }
    // 字符型，1字节，同上
    {
        char letter = 65;
    }

    // 宽字符型，2字节
    {
        wchar_t letter = L'Z';
    }
    // 宽字符型，2字节，同上
    {
        wchar_t letter = 0x5a;
    }

    // 修饰符
    {
        // 有符号整型值，可省略
        // 等同 singed int
        signed value = -5;
        // char 和 signed char由编译器决定，Visua C++定义为signed char

        // 无符号整型值
        unsigned long mileage = 0UL;
    }

    // 布尔类型，1字节
    {
        bool testResult{};
        bool colorIsRed = true;
    }

    // 浮点类型，8字节
    {
        // 双精浮点型
        double inToMm = 25.4;
        // 单精浮点型
        float pi = 3.14159F;

        // long double 有些编译器实现是16字节，Visucl C++实现中和double一致
    }

    // 类型别名
    {
        typedef long int BigOnes;
        BigOnes mynum1{};
        long int mynum2{};
        // C++11另一个语法
        using BigOnes = long int;
    }

    // 输入
    {
        int num1 = 0, num2 = 0;
        double factor = 0;
        std::cin >> num1 >> factor >> num2;
    }
    // 输出
    {
        int num1 = 1234, num2 = 5678;
        cout << endl;
        cout << num1 << num2;
        cout << endl;
    }

    // 格式化输出
    {
        int num1 = 0, num2 = 0;
        cout << num1 << ' ' << num2;
    }
    // 格式化输出
    {
        int num1 = 1234, num2 = 5678;
        cout << endl;
        cout << setw(6) << num1 << setw(6) << num2;
        cout << endl;
    }

    // 转义
    {
        cout << endl << "This is output.";
        cout << endl << "\tThis is output after a tab.";
    }
    // 转义，同上
    {
        cout << "\nThis is output.";
        cout << "\n\tThis is output after a tab.";

        char tab = 't';
    }
    // 转义序列
    {
        char newline = '\n';
        cout << newline;
        cout << "\"We'll make out escapes in sequence\", he said.";
        cout << "\n\tThe program's over, it's time ot make a beep beep.\a\a";
        cout << newline;
    }

    // 赋值
    {
        int part1 = 1, part2 = 2, part3 = 3;
        int whole = part1 + part2 + part3;
        int b = 1;
        int a = b = 2;
    }
    // 算术运算
    {
        int a = 0;
        int b = -5;
        a = -b;
        int number = 0;
        number = number + 1;
    }
    // 算术运算
    {
        // 房间的尺寸
        double height = 0, width = 0, length = 0;
        // 房间周长
        double perimeter = 0;

        // 卷宽
        const double rollWidth = 21.0;
        // 卷长（33英尺）
        const double rollLength = 12.0 * 33.0;

        // 一卷中的条数
        int stripsPerRoll = 0;
        // 所需卷数
        int stripsReqd = 0;
        // 总卷数
        int nrolls = 0;

        cout << endl
            << "Enter the height of the room in inches: ";

        cin >> height;

        cout << endl
            << "Now enter the length and width in inches: ";
        cin >> length >> width;

        // 每卷条数
        stripsPerRoll = rollLength / height;
        // 计算房间周长
        perimeter = 2.0 * (length + width);

        // 获得所需的总条数
        stripsReqd = perimeter / rollWidth;
        // 计算卷数
        nrolls = stripsReqd / stripsPerRoll;

        cout << endl
            << "For your room you need " << nrolls << " rolls of wallpaper."
            << endl;
    }

    return 0;
}
